/**
 * 用于获取指定范围内的随机整数
 * @param {number} a 随机数范围数字
 * @param {number} b 随机数范围数字 - 默认值为0
 * @returns 范围内的随机整数
 */
function getRandom(a, b = 0) {
    var max = a
    var min = b
    if(b>a) {
        max = b
        min = a
    }
    return parseInt(Math.random() * (max - min)) + min
}
/************ 使用示例 ************/
// var n = getRandom(50, 30)
// console.log(n);

/**
 * 获取随机颜色的函数
 * @param {boolean} hex 是否需要16进制的颜色值
 * @returns rgb颜色值字符串或16进制颜色值字符串
 */
function getColor(hex) {
    var arr = []
    var str = '#'
    for(var i=0; i<3; i++) {
        var num = getRandom(0, 256)
        arr.push(num)

        num = num.toString(16)
        num = num.length === 1 ? '0' + num : num
        str += num
    }
    if(hex) {
        return str
    }
    return 'rgb(' + arr.join() + ')'
}
/************ 调用示例 ************/
// var color = getColor(true)
// console.log(color);
// box.style.backgroundColor = color
/**
 * 批量设置样式的函数
 * @param {node} element 要设置样式的标签元素
 * @param {object} obj 要设置的样式的css键值对组成的对象
 */
// function setStyle(element, obj) {
//     for(var key in obj) {
//         element.style[key] = obj[key]
//     }
// }
function setStyle(element, obj) {
    var str = ''
    for(var key in obj) {
        str += key + ':' + obj[key] + ';'
    }
    element.style.cssText = str
}
/************** 调用示例 *****************/
/* setStyle(document.body, {
    width: '100%',
    height: '100%',
    background: 'url('+imgPath+') no-repeat 0 0 / 100% 100%'
}) */
/**
 * 动画函数
 * @param {node} ele 产生动画的标签元素
 * @param {object} obj 要进行动画的css属性和对应的目标值(目标值是数字)
 * @param {function} fn 当所有属性的动画结束后，要执行的函数
 */
function animate(ele, obj, fn = function() {}) {
    var k = 0
    for(let key in obj) {
        k++
        let timer = setInterval(function() {
            var target = obj[key]
            var l = getComputedStyle(ele)[key] 
            if(key === 'opacity') {
                target *= 100
                l *= 100
            }
            l = parseInt(l) 
            var speed = (target - l) / 20 
            speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed) 
            l += speed 
            if(key === 'opacity') ele.style[key] = l / 100
            else ele.style[key] = l + 'px'
            if(l === target) {
                clearInterval(timer)
                if(--k === 0) fn()
            }
        }, 20)
    }
}
/*************** 调用示例 *************/
// btn.onclick = function() {
//     animate(box, {
//         left: 500,
//         top: 300,
//         width: 200
//     }, function() {
//         color.style.backgroundColor = 'red'
//     })
// }
/**
 * 设置cookie的函数
 * @param {string} key cookie的键
 * @param {string} value cookie的值
 * @param {number} seconds 有效期-秒数
 * @param {string} path 路径 - 默认为 / 根目录
 */
function setCookie(key, value, seconds, path = '/') {
    var date = new Date()
    date.setTime(date.getTime() - 8*3600*1000 + seconds*1000)
    document.cookie = `${key}=${value};expires=${date};path=${path}`
}
/**
 * 获取cookie的函数
 * @param {string} key 要获取的cookie的键
 * @returns {string} 键对应的值
 */
function getCookie(key) {
    var cookies = document.cookie
    cookies = cookies.split('; ')
    for(var i=0; i<cookies.length; i++) {
        var brr = cookies[i].split('=')
        if(brr[0] === key) {
            return brr[1]
        }
    }
}
/**
 * 删除cookie的函数 - 依赖设置cookie的函数
 * @param {string} key 要删除的cookie的键
 * @param {string} path 要删除的cookie的路径 - 默认为 / 
 */
function removeCookie(key, path = '/') {
    setCookie(key, null, -1, path)
}

function sendAjax(obj) {
    if(obj.async === undefined) obj.async = true
    if(typeof obj.async != 'boolean') throw new Error('参数错误')
    if(obj.url === undefined) throw new Error('地址不能为空')
    if(typeof obj.url != 'string') throw new Error('地址有误')
    if(obj.method === undefined) obj.method = 'get'
    if(obj.method.toLowerCase() != 'get' && obj.method.toLowerCase() != 'post') throw new Error('请求方式必须是get或post')
    if(obj.success === undefined) obj.success = function(){}
    if(Object.prototype.toString.call(obj.success) != '[object Function]') throw new Error('success必须是函数')
    if(obj.error === undefined) obj.error = function(){}
    if(Object.prototype.toString.call(obj.error) != '[object Function]') throw new Error('error必须是函数')
    if(obj.dataType === undefined) obj.dataType = 'json'
    if(obj.headers === undefined) obj.headers = {}
    if(Object.prototype.toString.call(obj.headers) != '[object Object]') throw new Error('headers必须是键值对')
    var data = ''
    if(obj.data != undefined) {
        if(Object.prototype.toString.call(obj.data) === '[object String]') data = obj.data
        else if(Object.prototype.toString.call(obj.data) === '[object Object]') {
            var arr = []
            for(var key in obj.data) {
                arr.push(key + '=' + obj.data[key])
            }
            data = arr.join('&')
        } else throw new Error('数据有误')
        if(obj.method.toLowerCase() === 'get') obj.url += '?' + data
    }
    var xhr = new XMLHttpRequest()
    xhr.onreadystatechange = function() {
        if(xhr.readyState === 4) {
            if(xhr.status>=200 && xhr.status<300) {
                var res
                switch(obj.dataType) {
                    case 'xml':
                        res = xhr.responseXML
                        break;
                    case 'json':
                        res = JSON.parse(xhr.responseText)
                        break;
                    case 'text':
                        res = xhr.responseText;
                    break;
                    default: 
                        throw new Error('dataType有误')
                }
                obj.success(res)
            } else {
                obj.error()
            }
        }
    }
    xhr.open(obj.method, obj.url, obj.async)
    if(obj.headers) {
        for(var key in obj.headers) {
            xhr.setRequestHeader(key, obj.headers[key])
        }
    }
    if(obj.data && obj.method.toLowerCase() === 'post') {
        xhr.setRequestHeader('content-type', 'application/x-www-form-urlencoded')
        xhr.send(data)
        return
    }
    xhr.send()
}